package eu.jk.config;

import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;

import eu.jk.base.io.Texter;

/**
 * 配置工具->配置管理者
 * @author wenjianwzz
 * @version 1.0
 */
public abstract class ConfigManager {
	/**
	 * 全局配置Map
	 */
	private static HashMap<String, Config> configMap = new HashMap<String, Config>();
	
	/**
	 * 配置文件Map
	 */
	private static HashMap<String,ConfigFile> fileMap = new HashMap<String,ConfigFile>();
	
	/**
	 * 环境变量
	 */
	private static HashMap<String, String> enviroments = new HashMap<String, String>();
	/**
	 * 注册一个新的全局配置，如果存在同名配置，则不会被添加
	 * @param 配置名
	 * @return 配置名对应的配置对象
	 */
	private static Config newGlobalConfig(String configName) {
		Config config = null;
		synchronized (configMap) {
			if (!configMap.containsKey(configName)) {
				config = new Config(configName);
				configMap.put(configName, config);
				System.out.println(configName + " add to global map");
			} else
				config = configMap.get(configName);
		}
		return config;
	}

	/**
	 * 取得全局配置配置
	 * @param configName
	 * @return null if no
	 */
	public static Config getGlobalConfig(String configName) {
		synchronized (configMap) {
			return configMap.get(configName);
		}
	}

	/**
	 * 获取配置文件
	 * @param file 
	 * @return 配置文件
	 */
	public static ConfigFile getConfigFile(String file){
		synchronized(fileMap){
			return fileMap.get(file);
		}
	}
	/**
	 * 从文件读取配置并作为全局配置,若存在重名配置的时候，将会合并，合并的时候覆盖原同名键的值。
	 * @param file文件路径
	 * @throws FileNotFoundException 
	 */
	public static ConfigFile loadGlobalConfigFile(String file) throws FileNotFoundException {
		Texter fm = new Texter(file);
		List<String> lines = fm.readLines();
		String line;
		ConfigFile configFile = new ConfigFile(fm.getFile());
		synchronized(fileMap){
			fileMap.put(file, configFile);
		}
		int mode = 0;
		Config config = null;
		String cn = null;
		String key = null;
		String value = null;
		for (int i = 0; i < lines.size(); i++) {
			line = lines.get(i);
			if (line.startsWith("#"))
				continue;
			if (line.matches("\\[.*\\]")) {
				mode = 0;
				cn = line.substring(1, line.length() - 1);
				config = ConfigManager.newGlobalConfig(cn);
				config.setConfigFile(configFile);
				configFile.registerConfig(config);
			} else if (line.matches("!\\[.*\\]")) {
				mode = 1;
			} else if (line.matches(".*=.*")) {
				if (mode == 1)
					continue;
				key = line.split("=")[0];
				value=line.replace(key+'=', "");
				config.addParameters(key, value);
			}
		}
//		System.out.println("ConfigManager：read from \"" + file + "\" done");
		return configFile;
	}

	/**
	 * 从文件读取配置
	 * @param file文件路径
	 * @throws FileNotFoundException 
	 */
	public static ConfigFile loadConfigFile(String file) throws FileNotFoundException {
		Texter fm = new Texter(file);
		List<String> lines = fm.readLines();
		String line;
		ConfigFile configFile = new ConfigFile(fm.getFile());
		synchronized(fileMap){
			fileMap.put(file, configFile);
		}
		int mode = 0;
		Config config = null;
		String cn = null;
		String key = null;
		String value = null;
		for (int i = 0; i < lines.size(); i++) {
			line = lines.get(i);
			if (line.startsWith("#"))
				continue;
			if (line.matches("\\[.*\\]")) {
				mode = 0;
				cn = line.substring(1, line.length() - 1);
				config = new Config(cn);
				config.setConfigFile(configFile);
				configFile.registerConfig(config);
			} else if (line.matches("!\\[.*\\]")) {
				mode = 1;
			} else if (line.matches(".*=.*")) {
				if (mode == 1)
					continue;
				key = line.split("=")[0];
				value=line.replace(key+'=', "");
				config.addParameters(key, value);
			} 
		}
//		System.out.println("ConfigManager：read from \"" + file + "\" done");
		return configFile;
	}
	
	/**
	 * 获取环境变量
	 */
	public static String getEnviroment(String key) {
		return enviroments.get(key);
	}
	
	/**
	 * 设置环境变量
	 */
	public static void setEnviroment(String key,String value) {
		enviroments.put(key,value);
	}
}
